package com.bt.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import javax.servlet.Servlet;
import javax.sql.DataSource;

@Configuration
public class DruidConfig {
	
	//使其它数据源配置有效
	@ConfigurationProperties(prefix="spring.datasource")
	@Bean(destroyMethod="close",initMethod="init")
	public DataSource druidDataSource(){
		return new DruidDataSource();
	}
	
	//配置 监控服务器
	@Bean
	public ServletRegistrationBean<Servlet> statViewServlet(){
		ServletRegistrationBean<Servlet> srb=new ServletRegistrationBean<Servlet>(new StatViewServlet(),"/druid/*");
		//添加IP白名单-空表示默认允许所有访问
		srb.addInitParameter("allow",""); 
		//添加IP黑名单，当白名单和黑名单重复时，黑名单优先级更高
		srb.addInitParameter("deny","192.168.11.18");
		//添加控制台管理用户
		srb.addInitParameter("loginUsername","admin");
		srb.addInitParameter("loginPassword","999999");
		//是否能够重置数据
		srb.addInitParameter("resetEnable","false"); 
		return srb;
	}
	//配置 服务过滤器
	@Bean
	public FilterRegistrationBean<Filter> statFile(){
		FilterRegistrationBean<Filter> frb=new FilterRegistrationBean<Filter>(new WebStatFilter());
		//添加过滤规则
		frb.addUrlPatterns("/*");
		//忽略过滤格式
	frb.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
		return frb;
	}
}
/*
解析：
@ConfigurationProperties(prefix="spring.datasource")：这个注解会将 application.properties 或 application.yml 中以 spring.datasource 为前缀的属性自动注入到 DruidDataSource 中。比如 spring.datasource.url, spring.datasource.username, spring.datasource.password 等配置会被自动绑定。

@Bean(destroyMethod="close", initMethod="init")：表示将 DruidDataSource 配置为 Spring 容器中的一个 Bean，并指定了初始化方法和销毁方法。

initMethod="init"：当 DruidDataSource 实例创建时，Spring 会调用 init() 方法进行初始化。
destroyMethod="close"：当 DruidDataSource 被销毁时，Spring 会调用 close() 方法来关闭数据源，释放资源。
作用：配置了一个 Druid 数据源，使用 @ConfigurationProperties 自动加载配置文件中的数据源属性。*/

/*
解析：
ServletRegistrationBean<Servlet>：Spring Boot 提供的用于注册 Servlet 的方式。这里注册了 Druid 的监控界面 StatViewServlet，用于访问 Druid 数据源的状态监控页面。
		/druid*/
/*：指定了 Servlet 的访问路径，/druid/* 表示所有 /druid/ 开头的请求都会由 StatViewServlet 来处理。
初始化参数：
allow：配置 IP 白名单，允许哪些 IP 地址访问 Druid 的监控页面。空字符串表示允许所有 IP 地址访问。
deny：配置 IP 黑名单，禁止指定 IP 地址访问。这里设置了 192.168.11.18 这个 IP 为黑名单，禁止该 IP 访问监控页面。
loginUsername 和 loginPassword：设置 Druid 监控界面的登录用户名和密码，这里是 admin 和 999999。
resetEnable：设置是否允许在监控页面上重置数据源的状态。false 表示禁止重置。
作用：配置了 Druid 监控界面的 Servlet，并进行了 IP 白名单/黑名单、登录认证等设置。*/
